#!/bin/bash
#========Header=========================================================================|
#AUTOR:
#   Jefferson Rocha <lrcjefferson@gmaill.com>
#
#HOMEPAGE:
#   https://www.emmilinux.com.br
#
#DESCRIÇÃO:
#   Correção da brecha do apt,(sources.list) que permite adicionar um rep falso
#   no sources.list.
#   Este programa basicamente te mostra se o sources.list foi alterado, pois é
#   de clareza que ninguem fica verificando o sources.list.
#
#PORQUE?
#   Quando um rep é adicionado no sources.list é preciso uma chave para autenticação
#   do apt, mas isso pode ser burlado facilmente, por exemplo quando estamos rodando
#   o dpkg não podemos fazer uso do apt-key para adicionar uma nova chave no chaveiro,
#   Mas tem um jeito de burlar isto! podemos adicionar uma regra no crontab adicionando
#   algum script para manipular o mesmo e como consequencia usar o apt-key em x tempo.
#   Está é uma falha critica do APT, mesmo sendo o usuário que bota em risco a sua
#   máquina instalando pacotes de terceiros, o apt deveria se previnir e pelo menos
#   avisar que o Sources.list foi modificado.
#   E foi isto que fizemos, não intervimos mas avisamos como este script.
#
#
#O QUE FIZEMOS?
#   Basicamente nomeamos o dpkg original como dpkg2 e este script toma frente,
#   assim podemos fazer uma proteção a mais como assinatura com (md5) e comparação
#   do sources.list no final da instalação, a cada atualização vamos implementar mais
#   niveis de segurança.
#
#
#CHANGELOG:
#
#
#
#=======================================================================================|


#----VARIAVEIS


#----FUNCOES
log4space(){
  [ -e "/etc/apt/sources.list.copy" ] && rm /etc/apt/sources.list.copy
  [ -e "/etc/apt/sources.list.md5" ] && rm /etc/apt/sources.list.md5
  [ -e "/tmp/diff.log" ] && rm "/tmp/diff.log"
}

message(){
echo -e "\033[31;1m\t-------PERIGO!-------
Parece que algum pacote que você instalou modificou o Sources.list!
Isto pode ser uma ameaça para seu sistema, caso foi inserido algum repositório falso.
Veja o sources.list para ver o que foi alterado
Você deseja ver seu sources.list? [s/n]\033[m "
}

#-----TESTES INICIAIS
if [ $(echo "$UID") != "0" ]; then
  echo "Favor logar como root."
  exit 1
else
  copy=$(cp /etc/apt/sources.list /etc/apt/sources.list.copy 2>&-) # Copia inicial para diff futuro
fi

# Gerando chave md5
md5sum "/etc/apt/sources.list" > "/etc/apt/sources.list.md5"
dpkg2 "$@"  # Chamada dpkg real
[ $? != "0" ] && exit 1
# Comparando arquivos
md5sum -c "/etc/apt/sources.list.md5" >/dev/null 2>/dev/null
[ $? = "0" ] && rm /etc/apt/sources.list.md5 && exit 0  # Tudo certo? Então sai.

message # Chamada função para exibir mensagem
# Digitou s ou n? se não 3 tentativas.
i=0
while [ "$i" -le "3" ]; do
    read option; option_lower=${option,,} # entrada e tudo em minusculo.
    case $option_lower in
        s) break ;;
        n) break ;;
        *)
          echo "Digite [s/n]"
          let i++
          echo "-----Tentativa $i/3"
          [ "$i" = "3" ] && echo "Tentativa esgotada." && exit 1
    esac
done

if [ "$option_lower" = "s" ]; then
    diff /etc/apt/sources.list /etc/apt/sources.list.copy > /tmp/diff.log
    cat /tmp/diff.log
    log4space # Chamada função, apagar logs (.md5 e .copy)
    exit 1
else
    log4space # Chamada função, apagar logs (.md5 e .copy)
    exit 0
fi
